Larastan + reviewdog + CircleCI
https://qiita.com/kadoyau/items/a21f1fa17114797c32fd
できること
LarastanとreviewdogをCircleCIで回してGitHubに指摘コメントをする
https://gyazo.com/0d814441414a2bd297143896c2514750
対象
Laravel 5.7のプロジェクト
Larastan:0.3.15(初稿) -> 0.5系(2019-12-28 見直し時)
PHPStan:0.11.1(初稿)
Larastanをブラックボックスとして利用したために問題の切り分けに手こずった
Larastan 0.5系からはこの方法ではできない
https://github.com/nunomaduro/larastan/blob/master/UPGRADE.md
reviewdog: 0.9.14
自分が試みた限りではReviewdogでGitHub Checks(-reporter=github-pr-check)を利用することはできなかったので、PRのレビューコメントを付ける方法(-reporter=github-pr-review)で行った
reviewdogのGitHub Checksが422で失敗する
手順
1. Larastanをインストールする
ここでハマったことはLarastanを試すに書いた
2. reviewdogをCircleCIに導入する
公式の手順どおりに行う
GitHubのトークンを生成
github-pr-reviewで利用するのはREVIEWDOG_GITHUB_API_TOKENなのでGitHubの個人ページから生成する
権限とか詳しいことは公式を見よう
/icons/重要.icon CircleCIの環境変数に生成したGitHubのトークンを設定する
トークンをリポジトリにPushするのはセキュリティリスクなのでしない
CircleIC側に設定する
やり方:CircleCI#5c5e86e73f4425000020c92b
CircleCIの設定(config.yml)を書く
CircleCIのconfig.ymlの設定
プロジェクトごとに違うはずなので要点だけ書く
code:config.yml
jobs:
build:
docker:
- image: circleci/php:7.2-apache-node-browsers # 自分のアプリが動く環境
environment:
REVIEWDOG_VERSION: 0.9.14
steps:
- run: cp .env.ci .env.testing # (1)
- run: php artisan key:generate --env=testing
- run: php artisan migrate --env=testing
- run:
name: Install reviewdog # (2)
command: "curl -sfL https://raw.githubusercontent.com/reviewdog/reviewdog/master/install.sh| sh -s v$REVIEWDOG_VERSION"
- run:
shell: /bin/sh # (4)
name: Run reviewdog # (3)
# command: php artisan code:analyse --paths="packages" --error-format raw --no-progress --level=7 --no-tty 2>&1 | ./reviewdog -f=phpstan -reporter=github-pr-review // Larastan 0.4系以前
command: ./vendor/bin/phpstan analyse --error-format raw --no-progress 2>&1 | ./bin/reviewdog -f=phpstan -reporter=github-pr-review
0.5系のときには以下を追加する
code:phpstan.neon
includes:
- ./vendor/nunomaduro/larastan/extension.neon
parameters: parameters:
paths:
- packages // rootディレクトリ直下のsrcディレクトリ
level: 7
解説
(2) Install reviewdog
reviewdogのreadme通りにインストール
(3) Run reviewdog
前提
ローカル開発環境のテスト用の環境変数を.env.testにまとめている
CI用の環境変数を .env.ciにまとめている
(1) Laravelの自分のプロジェクト固有の話。.env.ciの中身を.env.testingに変更すると、以降Artisanで--env=testingをつけるとci用の環境変数が利用される
これをしない場合意図しない環境変数が利用されてしまうので必ずつける
--envをつけるのは面倒なので.env.ciは.envにコピーすれば良いと思う。今回は、ローカル環境でテスト用のテーブルをしっかりわけたので、phpunit.xmlが.env.testingを読みに行く設定になっているためにこうしている
--envをつけないと予期しないロードが走り、デフォルトlocalの部分があるらしくLaravel Telescopeが起動したりして死んだ
php artisan code:analyse --env=testing --paths="packages" --error-format raw --no-progress --level=7 --no-tty 2>&1
Larastan 0.4系以前のときのコマンド
引数の説明
env:前述の通り
これいらないのでは?(とったときの挙動は検証していません)
paths:Larastanを試す#5c5e7c713f4425000020c90a
error-format:reviewdog#5c5e2b3d3f4425000065a3bc
no-progress:reviewdogに食わせるときに進捗表示は邪魔。rawだけ出てほしい
level:PHPStanのかかり具合(大きいほど厳しい)
no-tty:Larastanを試す#5c5ead863f44250000a0530c
2>&1
./bin/reviewdog -f=phpstan -reporter=github-pr-review
reviewdogにphpstanの結果を渡している。reviewdogはPHPStanの内容(これはプロジェクト全体の警告を出す)と、PRの(多分)HEADと分岐元rootのブランチ内での変更点を比較し、PRででた変更点を抽出する
そしてその内容をreviewdogのGitHub連携によってGitHub上のPRコメントとして表示する
(4) この行がないとexit code 1で失敗する。理由はCircleCI上でCode 1で失敗扱いになるのはpipefailのせいかもしれない
もしPHPStanでやるなら
code:config.yml
command: |
./vendor/bin/phpstan analyze --level=5 -c phpstan.neon --error-format raw --no-progress packages | ./reviewdog -f=phpstan -reporter=github-pr-review
課題
https://github.com/haya14busa/reviewdog#table-of-contents みたいにbotのユーザアイコンにしたい
アクセスキーの人のコメントが付けられるので、自分のPRに自分がコメントしてしまい、なんとも言えない気分になる
参考
(phpstan + phpcs + reviewdog) on Docker